import { UPLOAD_URL } from '@/config/'

/**
 * 格式化数字
 * @param {number} n 
 */
const formatNumber = n => {
  n = n.toString()
  return n[1] ? n : `0${n}`
}

/**
 * 格式化日期
 * @param {Date} date 
 */
const moment = (val, rule = 'YYYY-MM-DD HH:mm:ss') => {
  const date = val ? new Date(val) : new Date()
  const obj = {
    YYYY: date.getFullYear(),
    MM: formatNumber(date.getMonth() + 1),
    DD: formatNumber(date.getDate()),
    HH: formatNumber(date.getHours()),
    mm: formatNumber(date.getMinutes()),
    ss: formatNumber(date.getSeconds())
  }
  const value = rule.replace(/[a-zA-Z]+/g, (key) => obj[key])
  return value
}

/* 空值判断  */
const isNull = n => {
  if (n === '' || n === null || n === undefined) {
    return true
  }
  return false
}

const setNum = (val) => {
  if (isNull(val)) {
    return 0
  }
  if (!isNaN(val)) {
    return Number(val)
  }
  return 0
}

/**
 * 数组判断
 * @param {any} n 
 * @param {number} len 
 */
const isArray = (n, len = 1) => {
  if (isNull(n)) {
    return false
  }
  if (Array.isArray(n) && n.length >= len) {
    return true
  }
  return false
}

/**
 * 表单校验
 * @param {object} opt 
 * @param {object} val 
 */
const validate = (opt, val) => {
  // 获取全部字段
  const keys = Object.keys(opt);
  let flag = true;
  keys.forEach(key => {
    if (flag) {
      // 获取当前字段的全部校验条件
      const { name, required = true, max = null, min = null, pattern = null  } = opt[key];
      if (required) {
        // 必填项
        if (isNull(val[key])) {
          flag = false;
          uni.showToast({
            icon: 'none',
            title: `${name}不得为空`,
          });
        } else {
          // 最大长度
          if (max !== null && val[key].length > max) {
            flag = false;
            uni.showToast({
              icon: 'none',
              title: `${name}不得超过${max}位`,
            });
            return;
          };
          // 最小长度
          if (min !== null && val[key].length < min) {
            flag = false;
            uni.showToast({
              icon: 'none',
              title: `${name}不得少于${min}位`,
            });
            return;
          };
          // 正则表达式
          if (pattern !== null && !pattern.test(val[key])) {
            flag = false;
            uni.showToast({
              icon: 'none',
              title: `请输入正确的${name}`,
            });
            return;
          };
        };
      } else {
        // 最大长度
        if (max !== null && val[key].length > max) {
          flag = false;
          uni.showToast({
            icon: 'none',
            title: `${name}不得超过${max}位`,
          });
          return;
        };
        // 最小长度
        if (min !== null && val[key].length < min) {
          flag = false;
          uni.showToast({
            icon: 'none',
            title: `${name}不得少于${min}位`,
          });
          return;
        };
        // 正则表达式
        if (pattern !== null && !pattern.test(val[key])) {
          flag = false;
          uni.showToast({
            icon: 'none',
            title: `请输入正确的${name}`,
          });
          return;
        };
      };
    };
  });
  return flag;
};

/**
 * 校验版本，升级更新
 * @param {function} callback
 */
function checkUpdate() {
  if (uni.canIUse('getUpdateManager')) {
    const updateManager = uni.getUpdateManager()
    updateManager.onCheckForUpdate(function (res) {
      // 请求完新版本信息的回调
      if (res.hasUpdate) {}
    })
    updateManager.onUpdateReady(() => {
      uni.showModal({
        title: '更新提示',
        content: '新版本已经准备好，是否重启应用？',
        success(res) {
          if (res.confirm) {
            // 新的版本已经下载好，调用 applyUpdate 应用新版本并重启
            updateManager.applyUpdate()
          }
        }
      })
    })
    updateManager.onUpdateFailed(() => {
      // 新的版本下载失败
      uni.showModal({
        title: '新版本下载失败',
        confirmText: '我知道了',
        showCancel: false
      })
    })
  }
}

// 选择文件
function uploadFile({ sourceType = ['camera', 'album'], count = 1, success }) {
  let source = [...sourceType]
  if (sourceType && sourceType.length === 2) {
    uni.showActionSheet({
      itemList: ['拍照','从相册选取'],
      success(e) {
        if (e.tapIndex === 0) {
          // 相机
          source = ['camera']
        } else {
          // 相册
          source = ['album']
        }
        choose()
      }
    })
  } else {
    choose()
  }
  
  function choose() {
    uni.chooseImage({
      sourceType: source,
      count,
      success(res) {
        uni.showLoading({
          mask: true,
        })
        res.tempFilePaths.forEach(filePath => {
          uploadImageApi(filePath, success)
        })
      }
    })
  }
}

function uploadImageApi(filePath, success) {
  uni.uploadFile({
    url: UPLOAD_URL,
    fileType: 'image',
    filePath,
    name: 'file',
    success(result) {
      uni.hideLoading()
      typeof success === 'function' && success(JSON.parse(result.data))
    }
  })
}

module.exports = {
  formatNumber,
  isNull,
  isArray,
  validate,
  checkUpdate,
  setNum,
  uploadFile,
  uploadImageApi,
  moment
}
